#include <iostream>
using namespace std;

// 构造函数的分类：
// 1. 按参数可分为： 有参构造 和 无参构造(默认构造）
// 2. 按类型可分为： 普通构造 和 拷贝构造

//构造函数的三种调用方法：括号法 ， 显示法 ， 隐式转换法

class Person {
public:
    Person() {
        cout << "无参 构造函数的调用" << endl;
    }
    Person(int a) {
        age = a;
        cout << "有参 构造函数的调用" << "\t" << age <<endl;
    }

    //拷贝构造函数
    Person (const Person & p) {
        // 将传入人身上的所有属性 ， 都拷贝到我身上
        age  = p.age;
        cout << "拷贝构造函数的调用" << "\t" << age << endl;
    }

    ~Person() {
        cout << "析构函数的调用" << endl;
    }

    int age;
};

//调用
void test01() {
    // 括号法
    Person p1; //无参
    Person p2(18); //有参
    Person p3(p2); //拷贝构造函数
    //注意事项1 ： 调用无参构造函数时 ， 不要加括号（） person p1();编译器会认为是函数的声明 ， 不会认为是创建对象

    //显示法
    Person(10); //匿名对象  特点 ： 当前执行结束后 ， 对象就销毁了（系统会立即回收掉匿名对象）

    Person p5 = Person(); // 无参
    Person p6 = Person(20); //有参
    Person p7 = Person(p6); //拷贝构造

    Person(10); //匿名对象  特点 ： 当前执行结束后 ， 对象就销毁了（系统会立即回收掉匿名对象）

    //注意事项2 ：不要利用拷贝构造函数 初始化匿名对象  如：Person (p7) ; 错误 编译器会认为是 Person (p7) == Person p7; 对象的声明


    //隐式转换法
    Person p8 = 15; // 相当于 Person p8 = Person(15); 有参构构造
    Person p9 = p8; // 相当于 Person p9 = Person(p8); 拷贝构造
}

int main() {
    test01();

    return 0;
}